package com.laoli.job;

import org.quartz.*;

/**
 * @PersistJobDataAfterExecution
 * 每次执行execute方法后更新jobDataMap里面的数据，也称为有状态的job，使得每次新创建的jobdetail对象，都保存着上次jobdetail对象里的数据（jobdatamap）
 * 如果没有这个注解，那么每次execute重新创建新的jobdetail，导致jobdatamap里的数据重新回到初始值
 * @DisallowConcurrentExecution
 * 禁止并发执行，如果一个任务正在执行，则新的任务被执行时将不会执行，只有任务执行完成以后才会执行新的任务（若想禁止并发访问同一个job定义，则采用该注解）
 * 比如说我任务定义的触发事件频率为每2s一次，但是我这个任务执行的时间需要耗时3s，
 * 那么使用这个注解后，任务的触发间隔会变成3s，而不是说我到了2s这个设定的时间就又执行新的任务了（也就是杜绝任务的并发执行）
 */
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
/**
 * 自定义任务类(实现Job接口，实现execute方法)
 */
public class MyJob implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        //context是定时任务执行的环境(上下文)，在这个环境/上下文中可以取出很多数据进行展示

        //获取jobDetail
        JobDetail jobDetail = context.getJobDetail();
        //System.out.println("System.identityHashCode(jobDetail) = " + System.identityHashCode(jobDetail));//这一条输出证明每次执行任务，这个JobDetail都是一个新创建的对象

        //输出详情
        /*
        System.out.println("任务名字："+jobDetail.getKey().getName());
        System.out.println("任务分组名字："+jobDetail.getKey().getGroup());
        System.out.println("任务类名字："+jobDetail.getJobClass().getName());
        System.out.println("本次执行时间："+context.getFireTime());
        System.out.println("下次执行时间："+context.getNextFireTime());
        */

        //记录任务执行次数
        JobDataMap jobDataMap = jobDetail.getJobDataMap();
        Integer count = (Integer) jobDataMap.get("count");
        System.out.println("第" + count + "次执行");
        System.out.println("本次执行时间："+context.getFireTime());
        jobDataMap.put("count", ++count); //更新共享数据

        //休眠3秒，这段代码是为了测试当任务触发频率设为2s，但实际任务执行耗时需要3s时会发生什么情况（用了@DisallowConcurrentExecution注解后那就是不管触发频率，而是等待任务执行结束后再开始新任务执行，也就是变成了间隔3s）
//        try {
//            Thread.sleep(3000);
//        } catch (InterruptedException e) {
//            throw new RuntimeException(e);
//        }
    }
}
